package com.dm.learn.threads.threadpool;

import java.util.concurrent.*;

/**
 * ThreadPoolExecutor的工作原理：
 * 首先线程池中依次添加线程
 * 当未达到核心线程数时，则线程池会依次创建线程，如果达到了核心线程数，后进入线程池的线程会被添加到阻塞队列
 * 如果阻塞队列满了，则会视非核心线程数创建非核心线程，如果线程数超过了非核心线程数maximumPoolSize，
 * 则会调用异常处理策略RejectedExecutionHandler
 * 在此期间如果核心线程中的线程执行完毕了，则会取得阻塞队列中的线程去执行。
 * 注意：核心线程不会被系统回收，而非核心线程如果超过了keepAliveTime规定的限时就会被回收
 */
public class ThreadPoolExecutorTest {
    ExecutorService executorService = new ThreadPoolExecutor(
            1,
            2,
            100,
            TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<>(2),
            Executors.defaultThreadFactory(),
            new RejectedExecutionHandler() {
                @Override
                public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                    if (r instanceof ThreadPoolTask){
                        System.out.println( "task:" + ((ThreadPoolTask) r).taskId + " is Handel!");
                        try {
                            TimeUnit.MILLISECONDS.sleep(51);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    );

    public static void main(String[] args) {
        ThreadPoolExecutorTest poolExecutorTest = new ThreadPoolExecutorTest();
        for (int i = 0; i < 10; i++) {
            poolExecutorTest.executorService.execute(new ThreadPoolTask());// 提交十个任务给线程池
        }
        poolExecutorTest.executorService.shutdown();
    }
}
